#include <QDebug>
#include "temhiswig.h"
#include "ui_temhiswig.h"

TemHisWig::TemHisWig(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::TemHisWig)
{
    ui->setupUi(this);

}

TemHisWig::~TemHisWig()
{
    delete ui;
}

// 初始化图表（适配UI创建的customPlot）
void TemHisWig::setupHistoryDataDemo()
{
    // 配置温度曲线（蓝色）
    ui->customPlot->addGraph();
    ui->customPlot->graph(0)->setPen(QPen(Qt::blue));
    ui->customPlot->graph(0)->setName("温度");

    // 配置X轴为时间轴
    QSharedPointer<QCPAxisTickerDateTime> dateTicker(new QCPAxisTickerDateTime);
    dateTicker->setDateTimeFormat("yyyy-MM-dd hh:mm:ss");
    ui->customPlot->xAxis->setTicker(dateTicker);
    dateTicker->setTickCount(5);
    ui->customPlot->xAxis->ticker()->setTickStepStrategy(QCPAxisTicker::tssMeetTickCount);

    // 轴配置
    ui->customPlot->xAxis->setLabel("时间");
    ui->customPlot->yAxis->setLabel("温度值 (℃)");
    ui->customPlot->axisRect()->setupFullAxesBox();
    ui->customPlot->legend->setVisible(true);

    // 初始化数据存储
    tempData.clear();
}



void TemHisWig::temHisplotData(QByteArray &jsonData){
    qDebug()<<"进入历史温度分析";
    // 解析JSON
       QJsonParseError parseError;
       QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData, &parseError);

       // 错误检查
       if (parseError.error != QJsonParseError::NoError) {
           qDebug() << "[ERROR] JSON解析失败:" << parseError.errorString();
           return;
       }

       if (!jsonDoc.isObject()) {
           qDebug() << "[ERROR] JSON不是对象类型";
           return;
       }

       QJsonObject rootObj = jsonDoc.object();

       // 仅处理type=4的数据
       if (rootObj["type"].toInt() != 4) {
           return;
       }

       // 验证key和data字段
       if (rootObj["key"].toInt() != 101 || !rootObj.contains("data") || !rootObj["data"].isArray()) {
           qDebug() << "[ERROR] 数据格式不正确";
           return;
       }

       QJsonArray dataArray = rootObj["data"].toArray();
       tempData.clear(); // 清空现有数据

       // 解析数据点
       for (int i = 0; i < dataArray.size(); ++i) {
           QJsonObject item = dataArray[i].toObject();

           // 解析时间
           QString timeStr = item["time"].toString();
           QDateTime time = QDateTime::fromString(timeStr, "yyyy-MM-dd hh:mm:ss");
           if (!time.isValid()) {
               qDebug() << "[WARNING] 无效时间格式:" << timeStr;
               continue;
           }

           // 解析温度值
           double temp = item["val"].toDouble();
           if (temp < -50 || temp > 150) {
               qDebug() << "[WARNING] 温度值超出范围:" << temp;
               continue;
           }

           // 存储数据（时间戳 -> 温度）
           tempData.append(QPointF(time.toTime_t(), temp));
       }

       // 更新图表
       updateHistoryPlot();
}

// 更新历史数据图表
void TemHisWig::updateHistoryPlot()
{
    if (tempData.isEmpty()) {
        qDebug() << "[WARNING] 没有有效数据可显示";
        return;
    }

    // 清空并添加新数据
    customPlot->graph(0)->data()->clear();
    // 拆分QPointF数据为x和y两个向量
        QVector<double> xData, yData;
        for (const QPointF &point : tempData) {
            xData.append(point.x());  // 时间戳
            yData.append(point.y());  // 温度值
        }

        // 使用x和y向量设置图表数据（匹配setData的参数要求）
        customPlot->graph(0)->setData(xData, yData);

    // 自动调整坐标轴范围
    ui->customPlot->xAxis->rescale();
    ui->customPlot->yAxis->rescale();

    // 添加边距使数据更美观
    double xMargin = (ui->customPlot->xAxis->range().upper - ui->customPlot->xAxis->range().lower) * 0.1;
    double yMargin = (ui->customPlot->yAxis->range().upper - ui->customPlot->yAxis->range().lower) * 0.1;

    ui->customPlot->xAxis->setRange(
        ui->customPlot->xAxis->range().lower - xMargin,
        ui->customPlot->xAxis->range().upper + xMargin
    );

    ui->customPlot->yAxis->setRange(
        ui->customPlot->yAxis->range().lower - yMargin,
        ui->customPlot->yAxis->range().upper + yMargin
    );

    // 重绘图表
    ui->customPlot->replot();
}



/*----------------------发布主题处理------------------------*/
//功能：实现数据的下发
//参数：
//      @key：要设置的设备的key值
//      @val：要下发的设备的控制指令，如true\false
//      @topic：要发布的主题
//返回值 无
void TemHisWig::temHistoryDownSlot(QString key,QString topic,QString startTime,QString endTime ){

    // 创建内层 data 对象
    QJsonObject dataObj;
    dataObj["key"] = key;
    QJsonArray limitArray;
    limitArray.append(startTime);
    limitArray.append(endTime);
    dataObj["limit"] = limitArray;

    //创建外层数据
    QJsonObject jsonData;
    jsonData["type"] = "4";//4 历史查询类型
    jsonData["data"] = dataObj;



// 将 JSON 对象转换为 JSON 文档
    QJsonDocument jsonDoc(jsonData);
// 以紧凑格式将 JSON 文档转换为字节数组
    QByteArray payload = jsonDoc.toJson(QJsonDocument::Compact);

    //发布消息
    QMQTT::Message message;
    message.setTopic(topic);
    message.setPayload(payload);

    quint16 messageId = GlobalVal::mqtt->publish(message);
}

void TemHisWig::on_pushButton_clicked()
{
    qDebug()<<"----------------获取日期-------------------";
    QDateTime startDateTime = ui->dateTimeEdit->dateTime();
    QString startdate = startDateTime.toString("yyyy-MM-dd hh:mm:ss");
    qDebug()<<"starttime:"<<startdate;
    QDateTime endDateTime = ui->dateTimeEdit_2->dateTime();
    QString enddate = endDateTime.toString("yyyy-MM-dd hh:mm:ss");
    qDebug()<<"endtime:"<<enddate;

    temHistoryDownSlot("101","app/data/down",startdate,enddate);

}
